
function foo () {
    return new Promise((r, j) => {
        setTimeout(() => {
            console.log('foo')
            r()
        }, 1000);
    })
}

function bar () {
    return new Promise((r, j) => {
        setTimeout(() => {
            console.log('bar')
            r()
        }, 1000);
    })
}

function baz () {
    return new Promise((r, j) => {
        setTimeout(() => {
            console.log('baz')
            r()
        }, 1000);
    })
}

// 解法一
// var arr = [foo, bar, baz]
// arr.reduce((pre, cur) => {
//     return pre.then(cur)
// }, Promise.resolve())




// 解法二

async function foo () {
    await setTimeout(() => {
        console.log('foo')
        bar()
    }, 1000);
}

async function bar () {
    await setTimeout(() => {
        console.log('bar')
        baz()
    }, 1000);
}

async function baz () {
    await setTimeout(() => {
        console.log('baz')
        foo()
    }, 1000);
}

foo()